SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
create Function [dbo].[FN_ValidaRNC] (@RNC as varchar(9)) Returns int
/*********************************************************************
  Funcion de Validacion de RNC
  Por            : Nobel Phipps, MCSA, MCP, A+
  Creacion        : 7 de Enero del 2005
  Ultima Modificacion    : 7 de Enero del 2005
  Valores de Retorno
            1     = RNC Valido
            0     = RNC Invalido
            -1    = RNC Incompleto
            -2    = RNC no numerico
*********************************************************************/
AS
Begin
Declare @Residuo as int
Declare @I as int
Declare @Cantidad as int
Declare @Verificador as int
Declare @Resultado as int
If len(ltrim(rtrim(@RNC))) <> 9
    Begin
        Return -1  -- Retorna -1 si la cedula esta incompleta
    end
else
    Set @Verificador = 0  -- Hago el Verificador = 0
    Set @I = 1  -- Inicializo I en 1
    While @I <= 9  -- Loop para evaluar los 9 digitos
    Begin
    if convert(varchar,substring(@RNC, @I,1)) not in ('0','1','2','3','4','5','6','7','8','9') or isnumeric(@RNC) = 0
        Begin
            return -2
        end
        Set @I = @I + 1
    end
    Set @Residuo =     ((convert(smallint,substring(@RNC,1,1)) * 7) +
            (convert(smallint,substring(@RNC,2,1)) * 9) +
            (convert(smallint,substring(@RNC,3,1)) * 8) +
            (convert(smallint,substring(@RNC,4,1)) * 6) +
            (convert(smallint,substring(@RNC,5,1)) * 5) +
            (convert(smallint,substring(@RNC,6,1)) * 4) +
            (convert(smallint,substring(@RNC,7,1)) * 3) +
            (convert(smallint,substring(@RNC,8,1)) * 2)) % 11
       
    If @Residuo = 0
    Begin
        Set @Verificador = 2
    end
    else if @Residuo = 1
    Begin
        Set @Verificador = 1
    end
    else
    Begin
        Set @Verificador = 11 - @Residuo
    End
    if convert(int, substring(@RNC, 9,1)) = @Verificador -- Comparar resultado con digito 11 de la cedula
    Begin
        Set @Resultado = 1  -- Se retorna 1 si la cedula es correcta
    end
    else
    Begin
        Set @Resultado = 0  -- Se retorna 0 si la cedula es incorrecta
    end
    Return @Resultado
END
GO
